//*************************************************************************//
//*           _____   ____________            ______               __     *//
//*          / /__ \ / ____/ ____/           / ____/___  _________/ /     *//
//*     __  / /__/ // __/ / __/    ______   / /_  / __ \/ ___/ __  /      *//
//*    / /_/ // __// /___/ /___   /_____/  / __/ / /_/ / /  / /_/ /       *//
//*    \____//____/_____/_____/           /_/    \____/_/   \__,_/        *//
//*                                                                       *//
//*     Copyright (c) 2006 Ford Argentina. All Rights Reserved.           *//
//*                                                                       *//
//*************************************************************************//

package ar.com.ford.it.webengine.security.helper;

import java.util.List;
import com.ford.it.logging.ILogger;
import com.ford.it.logging.LogFactory;


/**
 * SecurityHelper <br>
 * Valida los permisos del usuario contra una lista de permisos requeridos.
 * 
 * @author Aji
 */
public class SecurityHelper {

    private static final String CLASS_NAME = SecurityHelper.class.getName();
    private static final ILogger log = LogFactory.getInstance().getLogger(CLASS_NAME);

	private boolean andexp = false;	

	/**
	 * Constructor
	 */
	public SecurityHelper() {
	}
	
	
	/**
	 * Constructor
	 * @param andexp true: cuando se valida una lista de permisos, se aplica AND a los resultados
	 * (De lo contrario se aplica OR)
	 */
	public SecurityHelper(boolean andexp) {
		this.andexp = andexp;
	}
	
	
	/**
	 * Validar la lista de permisos del usuario(lprm) contra la lista
	 * de permisos requeridos <br>
	 * Si la lista de permisos requeridos es null pasa la validacion.
	 * 
	 * @param lprm Permisos del usuario
	 * @param authorizedFor Permisos requeridos
	 * @return true si pasa la validacion
	 */
	public boolean check(List lprm, String authorizedFor) {
		String METHOD_NAME = "check";
		boolean result;

		log.entering(CLASS_NAME, METHOD_NAME);
		
		if (authorizedFor != null && !authorizedFor.equals("")) {
			// requeire permisos y el usuario no posee
			if (lprm == null || lprm.isEmpty()) {
	        	log.exiting(CLASS_NAME, METHOD_NAME, "false");
	        	return false;
	        }
			
			if (andexp) 
				result = checkAndExp(lprm, authorizedFor);
			else
				result = checkOrExp(lprm, authorizedFor);
		}
		else {
			result = true;	
		}

		log.exiting(CLASS_NAME, METHOD_NAME, Boolean.toString(result));		
		return result;
	}
	
	

	/**
	 * Validar la lista de permisos aplicando OR a los resultados
	 * 
	 * @param lprm Permisos del usuario
	 * @param authorizedFor Permisos requeridos
	 * @return true si pasa la validacion
	 */
	private boolean checkOrExp(List lprm, String authorizedFor) {
		String METHOD_NAME = "checkOrExp";
		
		log.entering(CLASS_NAME, METHOD_NAME);
		
		boolean passed = false;
		int indice = 0;
		
		String permisos[] = authorizedFor.replaceAll(" ", "").split(",");

		while (indice < permisos.length) {
			if (lprm.contains(permisos[indice])) {
				passed = true;
				break;
			}
			indice++;
		}

		log.exiting(CLASS_NAME, METHOD_NAME, Boolean.toString(passed));
		return passed;		
	}



	/**
	 * Validar la lista de permisos aplicando AND a los resultados
	 * 
	 * @param lprm Permisos del usuario
	 * @param authorizedFor Permisos requeridos
	 * @return true si pasa la validacion
	 */
	private boolean checkAndExp(List lprm, String authorizedFor) {
		String METHOD_NAME = "checkAndExp";
		
		log.entering(CLASS_NAME, METHOD_NAME);
		
		boolean passed = true;
		int indice = 0;
		
		String permisos[] = authorizedFor.replaceAll(" ", "").split(",");

		while (indice < permisos.length) {
			if (!lprm.contains(permisos[indice])) {
				passed = false;
				break;
			}
			indice++;
		}

		log.exiting(CLASS_NAME, METHOD_NAME, Boolean.toString(passed));
		return passed;		
	}


	/**
	 * Returns the andexp.
	 * 
	 * @return andexp
	 */
	public boolean isAndexp() {
		return andexp;
	}


	/**
	 * Sets the andexp.
	 * 
	 * @param andexp The andexp to set
	 */
	public void setAndexp(boolean andexp) {
		this.andexp = andexp;
	}

}
